完蛋了今天,今天比昨天打完更嚴重,睡到晚上3點,被身體熱醒,起床量個溫度37.3好像又不是很高,但熱到睡不著,只好走出房間休息的一時半刻,最後終於在四點多睡著,結果今天一天,頭都超痛,手臂也會痛,眼壓還特別高,這算是變相在懲罰我吧!
今天算是來複習Delegate的使用,因為之後的頁面都會使用到Delegate這個概念
什麼是Delegate?
Delegate 比較像是一個Design Pattern,算是一種程式設計的手法
Swift這個程式語言具有POP的性質,那什麼事POP?
POP是Protocol Oriented Programming的意思,可以使用Protocol來完成很多交付任務
先來看一下UML
這張圖顯示了彼此之間的關係
也知道我們在設計Delegate會有三個要素:
由這三個名詞解釋,可以知道是由Delegate作為最終的執行者
Protocol作為兩個之中的連結
這邊是Code碼示範,會引用AppCoda的資料,加上我的理解,詳細網站會附在下面
要做到的事情是使用Delegate傳遞資料
將第二視圖輸入
的資料在第一視圖內呈現
// 第一視圖
class FirstViewController: UIViewController {
@IBOutlet weak var labelPlatformDetails: UILabel!
@IBOutlet weak var labelDeveloperLanguage: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
}
//MARK: - Navigation
@IBAction func actionAddDetail(_ sender: UIButton) {
// 實例化一個第二視圖ViewController
guard let secondView = self.storyboard?.instantiateViewController(withIdentifier: "SecondViewController") as? SecondViewController else {
fatalError("View Controller not found")}
// 將第二視圖內的Delegate由這第一視圖來執行
secondView.delegate = self //Protocol conformation here
// 切換ViewController
navigationController?.pushViewController(secondView, animated: true)}
}
//MARK: - Protocol Delegate Methods
extension FirstViewController: DeveloperEntryDelegate {
// 將第二視圖所回傳的資料text 放入第一視圖的text內
func textDeveloperPlatform(_ text: String){
labelPlatformDetails.text = "Platform: \(text)" }
// 將第二視圖所回傳的資料text 放入第一視圖的text內
func textDeveloperLanguage(_ text: String) {
labelDeveloperLanguage.text = "Language: \(text)" }
}
// 第二視圖
// Delegate Protocol
protocol DeveloperEntryDelegate: AnyObject {
func textDeveloperPlatform(_ text: String)
func textDeveloperLanguage(_ text: String) }
class SecondViewController: UIViewController {
// 產生一個delegate變數,用途負責傳送資料
// 使用weak 所以上面的Protocol: AnyObject
weak var delegate: DeveloperEntryDelegate?
@IBOutlet weak var textPlateform: UITextField!
@IBOutlet weak var textLanguage: UITextField!
override func viewDidLoad() {
super.viewDidLoad() }
//MARK: - Action Pass back view Details
@IBAction func actionDone(_ sender: UIButton) {
self.navigationController?.popViewController(animated: true)
// 使用Delegate傳送這個剛剛輸入文字的函數
self.delegate?.textDeveloperPlatform(textPlateform.text ?? "")
self.delegate?.textDeveloperLanguage(textLanguage.text ?? "")
}
}
參考網站:
了解 Delegation Pattern 讓你更有效率地實作類別之間的溝通!
iOS 開發者指南:透過 Swift 4 學習 Delegates 與 Delegation
Class Diagram to convey the Delegate Pattern